import numpy as np
from tool_kit.calc_time import calc_time
from pandas import Series, DataFrame


### 二、处理丢失数据
## 补充：计算不同数据类型求和时间
@calc_time()
def test(typ):
    n = np.arange(1e7, dtype=typ)
    print(type(n[0]))


test(int)
test(float)
test(np.float32)
test(np.float64)
test(object)

## 1 None
n0 = np.array([1, 2, 3, None])
# n0.sum()  # 报错

## 2 np.nan
print(type(np.nan))
n = np.array([1, 2, 3, np.nan])
print(np.sum(n))  # 可以计算，但计算的结果总是NaN
print(np.nansum(n))  # 使用np.nan*()函数计算nan，此时视nan为0

## 3 pandas中None与NaN的操作
data = np.random.randint(0, 150, size=(4, 4))
index = ['张三', '李四', '王五', '赵六']
columns = ['语文', '数学', '英语', 'python']
df = DataFrame(data, index, columns)
print(df)
# 3.1 pandas中None与np.nan都被视为np.nan
df.loc['张三', '语文'] = None
df.loc['李四', '数学'] = np.nan
print(df)
# 3.2 pandas中None与np.nan的操作
print(df.isnull())
print(df.notnull())
# 判断列是否有NaN数据，默认axis=0
print(df.isnull().any())
# 判断行是否有NaN数据
print(df.isnull().any(axis=1))
# 过滤
print(df.dropna(axis=0, how='any', subset=['数学', '英语']))
# 填充
# 指定值填充
print(df.fillna(value=100))
# 使用已有的数据填充
df.fillna(axis=0, method='bfill', limit=1)
